package com.bml.architect.redis.source;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.Pipeline;

import java.util.Arrays;
import java.util.List;

public class JedisSingleTest {

    public static void main(String[] args) {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxIdle(10);
        config.setMaxTotal(20);
        config.setMinIdle(5);
        // timeout，这里既是连接超时又是读写超时，
        // 从Jedis 2.8开始有区分connectionTimeout和soTimeout的构造函数
        JedisPool pool = new JedisPool(config,"192.168.56.120",6379,30000,null);
        Jedis jedis = pool.getResource();
        //普通的操作
        jedis.set("dev","java高级开发");
        System.out.println(jedis.get("dev"));

        //通过批量的操作，使用管道操作
        Pipeline pipeline = jedis.pipelined();
        for (int i = 0; i <10 ; i++) {
            pipeline.set("pipe"+i,"pipe测试"+i);
        }
        List<Object> objects = pipeline.syncAndReturnAll();
        for (Object object : objects) {
            System.out.println(object);
        }


        //使用lua脚本,下面的脚本的意思就是说传入key,和值ARGV，先通过可以获取到key对应的值
//        如果获取的key的值还大于等于传入的值，那么相减持久化到redis中
        //其实就是一个减库存的操作 KEYS[1]代表的是商品的key，ARGV[1]代表的是要减的库存数量
        StringBuilder script = new StringBuilder();
        script.append("local count = redis.call('get',KEYS[1])");
        script.append("local a = tonumber(count)");
        script.append("local b = tonumber(ARGV[1])");
        script.append("if a >= b then redis.call('set',KEYS[1], a - b) return 1 end");
        script.append(" return 0 ");
        //其中Arrays.asList("product_1001")对应的是KEYS[1],Arrays.asList("5")对应的是ARGV[1]
        //在redis中就相当于执行了 count = get product_1001,set product_1001 a-b
        Object eval = jedis.eval(script.toString(), Arrays.asList("product_1001"),Arrays.asList("5"));
        System.out.println("脚本执行结果="+eval);

    }
}
